草庐IT

javascript oop、instanceof 和基类

全部标签

c++ - 为什么允许通过基类的指针调用派生类的私有(private)虚方法?

#includeusingnamespacestd;classA{public:virtualvoidf(){coutf();return0;}此代码正常工作并打印B::f()。我知道它是如何工作的,但为什么允许这段代码? 最佳答案 访问控制在编译时执行,而不是运行时。对f()的调用通常无法知道ptr指向的对象的运行时类型,因此不会检查派生类的访问说明符。这就是允许调用的原因。至于为什么允许使用私有(private)函数覆盖B类-我不确定。当然B违反了从A继承的接口(interface),但通常C++语言并不总是强制接口(inter

c++ - 为什么编译器会选择模板参数列表中的基类构造函数?

向thisone提出后续问题.基本上,在下面的代码中,为什么编译器会认为B里面A在Cs构造函数是指B的(不可访问的)构造函数基类?structB{};templatestructA:privateT{};structC:publicA{C(A);//ERRORHERE};LiveexampleonIdeone.输出:prog.cpp:1:9:error:'structBB::B'isinaccessibleprog.cpp:7:7:error:withinthiscontext请注意,如果将构造函数参数更改为A,则会弹出相同的错误。,A甚至A.另请注意,MSVC10、GCC4.7和Cl

c++ - 为什么编译器会选择模板参数列表中的基类构造函数?

向thisone提出后续问题.基本上,在下面的代码中,为什么编译器会认为B里面A在Cs构造函数是指B的(不可访问的)构造函数基类?structB{};templatestructA:privateT{};structC:publicA{C(A);//ERRORHERE};LiveexampleonIdeone.输出:prog.cpp:1:9:error:'structBB::B'isinaccessibleprog.cpp:7:7:error:withinthiscontext请注意,如果将构造函数参数更改为A,则会弹出相同的错误。,A甚至A.另请注意,MSVC10、GCC4.7和Cl

c++ - 了解虚拟基类和构造函数调用

我对虚拟基类的工作方式有点困惑。特别是,我想知道如何调用基类的构造函数。我写了一个例子来理解它:#include#includeusingstd::string;structA{strings;A(){}A(stringt):s(t){}};structB:virtualpublicA{B():A("B"){}};structC:virtualpublicA{};structD:publicB,publicC{};structE:publicC,publicB{};structF:publicB{};intmain(){Dd;printf("\"%s\"\n",d.s.c_str())

c++ - 了解虚拟基类和构造函数调用

我对虚拟基类的工作方式有点困惑。特别是,我想知道如何调用基类的构造函数。我写了一个例子来理解它:#include#includeusingstd::string;structA{strings;A(){}A(stringt):s(t){}};structB:virtualpublicA{B():A("B"){}};structC:virtualpublicA{};structD:publicB,publicC{};structE:publicC,publicB{};structF:publicB{};intmain(){Dd;printf("\"%s\"\n",d.s.c_str())

c++ - 使用派生类的静态 constexpr 数据成员初始化基类的静态 constexpr 数据成员

考虑以下代码:templatestructS{staticconstexprintbar=T::foo;};structU:S{staticconstexprintfoo=42;};intmain(){}GCCv6.1编译它,clang3.8以错误拒绝它:2:error:nomembernamed'foo'in'U'structS{staticconstexprintbar=T::foo;};哪个编译器是正确的?难道是因为Uisnotacompletetype在我们尝试在S中使用它的地方?在这种情况下,它应该被认为是GCC的错误,但我想知道我是否适合在错误跟踪器上搜索/打开问题...编

c++ - 使用派生类的静态 constexpr 数据成员初始化基类的静态 constexpr 数据成员

考虑以下代码:templatestructS{staticconstexprintbar=T::foo;};structU:S{staticconstexprintfoo=42;};intmain(){}GCCv6.1编译它,clang3.8以错误拒绝它:2:error:nomembernamed'foo'in'U'structS{staticconstexprintbar=T::foo;};哪个编译器是正确的?难道是因为Uisnotacompletetype在我们尝试在S中使用它的地方?在这种情况下,它应该被认为是GCC的错误,但我想知道我是否适合在错误跟踪器上搜索/打开问题...编

c++ - 在派生类初始化器列表中初始化模板基类成员类型

这里有一些代码概述了我一直在努力解决的问题。最后一个问题(目前就g++而言)是:执行Bar::Bar(...)构造函数例程时,“错误:'Foo-T'未在此范围内声明”。否则,我试图解决的问题是基于使用模板传递给派生类构造函数的参数设置基类成员类型之一。如果有一种方法可以简单地通过将参数传递给派生类构造函数来设置基类成员类型(TFoo-T),我更愿意这样做。到目前为止,我看不到同时使用模板参数和匹配的派生类构造函数参数来完成此任务的方法。您能在以下代码中发现我可以做得更好以实现相同目标的任何内容吗?我对通用编码和模板比较陌生。#includetypedefinta_arg_t;typed

c++ - 在派生类初始化器列表中初始化模板基类成员类型

这里有一些代码概述了我一直在努力解决的问题。最后一个问题(目前就g++而言)是:执行Bar::Bar(...)构造函数例程时,“错误:'Foo-T'未在此范围内声明”。否则,我试图解决的问题是基于使用模板传递给派生类构造函数的参数设置基类成员类型之一。如果有一种方法可以简单地通过将参数传递给派生类构造函数来设置基类成员类型(TFoo-T),我更愿意这样做。到目前为止,我看不到同时使用模板参数和匹配的派生类构造函数参数来完成此任务的方法。您能在以下代码中发现我可以做得更好以实现相同目标的任何内容吗?我对通用编码和模板比较陌生。#includetypedefinta_arg_t;typed

c++ - 为什么派生类不使用基类 operator=(赋值运算符)?

以下是实际问题的简化版本。与调用Base::operator=(int)不同,该代码似乎生成了一个临时Derived对象并改为复制该对象。为什么不使用基本赋值运算符,因为函数签名似乎完美匹配?这个简化的示例没有显示任何不良影响,但原始代码在析构函数中有一个副作用,会导致各种破坏。#includeusingnamespacestd;classBase{public:Base(){cout输出是:StartBase()Derived()Base(int)Derived(int)~Derived()~Base()Finish~Derived()~Base()http://ideone.com